<?php
/**
 * 自定义TestCase
 */
class TestCase extends PHPUnit_Framework_TestCase
{
    /**
     * 测试配置信息
     * @var array 
     */
    public $config = array();
    
    /**
     * @var 测试类型
     */
    public static $testType = 'api';
    
    /**
     * 执行接口测试之前或对数据做一次且仅一次清理，该参数标识是否已清理过
     * @var boolean
     */
    public static $cleanData = false;
    
    /**
     * 构造函数
     * @param string $theClass
     * @param string $name 
     */
    public function __construct( $theClass = '', $name = '' )
    {
        $this->config = &Common::getConfig( 'Common' );

        parent::__construct( $theClass, $name );
    }
    
    /**
     *清空测试环境，确保各模块测试之间无关
     */
    public static function clearTestEnv()
    {
        //清空redis缓存数据
        $redisInstance = Helper_Redis::getInstance( 'feedList' );
        $redisKeys = $redisInstance->getKeys( '*' );
        foreach( $redisKeys as $key )
        {
            $redisInstance->delete( $key );
        }

        //清空memcache缓存数据
        Common::getCache()->flush();
        
        //清空common数据库
        $db = Common::getMysql();
        $tables = array( 'counter' , 'friend_log' , 'user_info_search' , 'friend_log_archiv' );
        foreach( $tables as $table )
        {
            $db->query( "DELETE FROM `{$table}`" );
        }
        
        //清空分库
        $db = Common::getMysql( 'qicai' );
        $tables = array( 'user_info' , 'user_feed' , 'user_feed_read' , 'user_feed_comment' , 'user_friend' );
        foreach( $tables as $table )
        {
            $db->query( "DELETE FROM `{$table}`" );
        }
    }
    
    /**
     * 在每个测试类实例化之前执行
     */
    public static function setUpBeforeClass() 
    {
        $class = get_called_class();
        
        $testType = $class::$testType;
        
        //单元测试一定每次都清理，接口测试清理一次
        if( $testType == 'unit' || !self::$cleanData )
        {
            self::clearTestEnv();
            if( $testType == 'api' )
            {
                self::$cleanData = true;
            }
        }
        
        parent::setUpBeforeClass();
    }
}